package copyengine.ui.component.scrollablePanel.scrollPanel
{
    import copyengine.ui.component.scrollablePanel.element.ICEScrollableElement;
    import copyengine.utils.GeneralUtils;
    import copyengine.utils.ICEDispose;

    import flash.geom.Rectangle;

    import starling.display.DisplayObjectContainer;

    /**
     *  该类只处理所有Element的刷新
     *  --->判断每个Element是否和Viewport发生碰撞 如有没有则不显示 否则显示
     *
     *  对于视口viewportRe的移动 交个TouchProxy处理
     *  对于Element的 添加/删除 交给 ScrollPanel主类助理
     *  对于Element的排序交个Layout处理
     *
     */
    public class CEScrollPanelCore implements ICEDispose
    {
        public var viewportRe:Rectangle;
        public var scrollPanelContainer:DisplayObjectContainer;
        public var allSubElementVector:Vector.<ICEScrollableElement>;

        /**
         * 用于刷新时候的临时交换,
         */
        private var mTempAllShowElementVector:Vector.<ICEScrollableElement>;


        public function CEScrollPanelCore()
        {
            allSubElementVector = new Vector.<ICEScrollableElement>();
            mTempAllShowElementVector = new Vector.<ICEScrollableElement>();
            super();
        }

        public function dispose():void
        {
            GeneralUtils.disposeAllDisposeAbleObjectInArrayOrVector(allSubElementVector);
            allSubElementVector = null;
            mTempAllShowElementVector = null;
        }

        //==============================//
        //==Public Interface  Function
        //==============================//

        /**
         * 内部刷新逻辑,
         * 以当前Viewport为准,无论之前Viewport在哪里
         * 首先将在目前Viewport区域中不会显示的Element先Hide一遍 其后再把会显示的Element Show出来
         * 这样做的目的 是在调用Hide方法时候 如果是List的Element会首先归还自己的显示对象,这样其他Element在Show的时候
         * 才能从缓存池中将显示对象给取出来
         *
         * 注意:
         * 1` viewport的改变是TouchProxy的事情
         * 2` Element的增删改是ScrollPanel的事情
         * 3` LayoutElement是 Layout组件的事情
         *
         * Core组件仅仅提供Refresh接口  也就是其仅仅处理Element的show/hide . 上层逻辑调用refresh之前务必保证其它操作均已执行完毕
         */
        public function refresh():void
        {
            //Step1
            //清空缓存Vector
            mTempAllShowElementVector.length = 0;

            //Step2
            //将没有显示的Element先Hide,这样List的ScrollPanel会先归还显示对象
            for each(var element:ICEScrollableElement in allSubElementVector) {
                if (element.getBounds().intersects(viewportRe)) {
                    mTempAllShowElementVector.push(element);
                } else {
                    element.hide();
                }
            }

            //Step3
            //将目前需要显示的Element Show出来
            for each(var showElement:ICEScrollableElement in mTempAllShowElementVector) {
                showElement.show(scrollPanelContainer, viewportRe);
            }
        }

    }


}
